package cryptx

import (
	"codeup.aliyun.com/lsxd/zltx/adapter/utils/cryptx/cipher"
	"codeup.aliyun.com/lsxd/zltx/adapter/utils/formater"
	"github.com/dromara/dongle"
)

type BaseCrypto struct {
	fmt formater.Formater
	cp  *cipher.Cipher
}

// NewBaseCrypto 创建一个新的BaseCrypto
func NewBaseCrypto() *BaseCrypto {
	return &BaseCrypto{
		fmt: formater.Base64,
		cp:  cipher.NewCipher(),
	}
}

// SetFormat 设置格式化器
func (b *BaseCrypto) SetFormat(f formater.Formater) {
	b.fmt = f
}

// SetMode 设置加密模式
func (b *BaseCrypto) SetMode(mode cipher.CipherMode) {
	b.cp.SetMode(mode)
}

// SetKey 设置密钥
// 可以是密钥+偏移量，也可以是公钥+私钥，请按照说明顺序填写
// 密钥+偏移量模式时，偏移量可以为空
// 公钥+私钥模式时，公钥和私钥必须是一对
func (b *BaseCrypto) SetKey(index int, key string) {
	b.cp.SetKey(index, key)
}

// SetPadding 设置填充方式
func (b *BaseCrypto) SetPadding(padding cipher.CipherPadding) {
	b.cp.SetPadding(padding)
}

// Cipher 返回加密器
func (b *BaseCrypto) Cipher() *dongle.Cipher {
	return b.cp.Cipher()
}

// MyCipher 返回加密器
func (b *BaseCrypto) MyCipher() *cipher.Cipher {
	return b.cp
}

// PrivateKey 返回私钥
func (b *BaseCrypto) PrivateKey() string {
	if len(b.cp.Keys[0]) == 0 {
		return ""
	}
	return b.cp.Keys[0]
}

// PublicKey 返回公钥
func (b *BaseCrypto) PublicKey() string {
	if len(b.cp.Keys[1]) == 0 {
		return ""
	}
	return b.cp.Keys[1]
}

// Formatter 返回格式化器
func (b *BaseCrypto) Formatter() formater.Formater {
	return b.fmt
}
